///******************************************************************************* // * Copyright (c) 2004, 2006 IBM Corporation and others. // * All rights reserved. This program and the accompanying materials // * are made available under the terms of the Eclipse Public License v1.0 // * which accompanies this distribution, and is available at // * http://www.eclipse.org/legal/epl-v10.html // * // * Contributors: // * IBM Corporation - initial API and implementation // *******************************************************************************/ //package org.eclipse.ui.tests.menus; // //import java.io.ByteArrayInputStream; //import java.util.ArrayList; //import java.util.Arrays; //import java.util.HashSet; //import java.util.Iterator; //import java.util.List; //import java.util.Set; // //import org.eclipse.core.resources.IFile; //import org.eclipse.core.resources.IProject; //import org.eclipse.core.resources.IResource; //import org.eclipse.core.resources.IWorkspace; //import org.eclipse.core.resources.ResourcesPlugin; //import org.eclipse.core.resources.mapping.ResourceMapping; //import org.eclipse.core.runtime.CoreException; //import org.eclipse.jface.action.GroupMarker; //import org.eclipse.jface.action.IContributionItem; //import org.eclipse.jface.action.MenuManager; //import org.eclipse.jface.action.SubContributionItem; //import org.eclipse.jface.viewers.ISelection; //import org.eclipse.jface.viewers.ISelectionChangedListener; //import org.eclipse.jface.viewers.ISelectionProvider; //import org.eclipse.jface.viewers.IStructuredSelection; //import org.eclipse.jface.viewers.StructuredSelection; //import org.eclipse.ui.IWorkbenchPage; //import org.eclipse.ui.IWorkbenchPart; //import org.eclipse.ui.PlatformUI; //import org.eclipse.ui.internal.PluginActionContributionItem; //import org.eclipse.ui.internal.PopupMenuExtender; //import org.eclipse.ui.internal.WorkbenchWindow; //import org.eclipse.ui.tests.harness.util.UITestCase; //import org.eclipse.ui.tests.menus.ObjectContributionClasses.ICommon; // ///** // * Tests that object contributions are enabled and shown correctly in pop-up // * menus depending on the state of the workbench. This test relies on the // * <code>plugin.xml</code> file containing certain values. Please see the // * appropriate section in that file for more information about the initial // * set-up. // * // * @since 3.0 // */ //public final class ObjectContributionTest extends UITestCase { // // /** // * Constructs a new instance of <code>ObjectContributionTest</code> with // * the name of the test. // * // * @param name // * The name of the test; may be <code>null</code>. // */ // public ObjectContributionTest(final String name) { // super(name); // } // // /** // * Tests whether the content-type object contribution works. This is testing // * a use care familiar to Ant UI. The content-type scans an XML file to see // * if its root element is <code><project></code>. // * // * @throws CoreException // * If a problem occurs when creating the project or file, or if // * the project can't be opened. // */ // public final void testObjectStateContentType() throws CoreException { // // Create an XML file with <project> as its root element. // final IWorkspace workspace = ResourcesPlugin.getWorkspace(); // final IProject testProject = workspace.getRoot().getProject( // "ObjectContributionTestProject"); // testProject.create(null); // testProject.open(null); // final IFile xmlFile = testProject.getFile("ObjectContributionTest.xml"); // final String contents = "<testObjectStateContentTypeElement></testObjectStateContentTypeElement>"; // final ByteArrayInputStream inputStream = new ByteArrayInputStream( // contents.getBytes()); // xmlFile.create(inputStream, true, null); // final ISelection selection = new StructuredSelection(xmlFile); // assertPopupMenus( // "1", // new String[] { "org.eclipse.ui.tests.testObjectStateContentType" }, // selection, null, true); // } // // /** // * This tests backwards compatibility support for adaptable IResource // * objectContributions. This allows IResource adaptable contributions // * without an adapter factory and using the IContributorResourceAdapter // * factory. In addition, test the ResourceMapping adaptations. // * // * @since 3.1 // */ // public final void testContributorResourceAdapter() throws CoreException { // // final IWorkspace workspace = ResourcesPlugin.getWorkspace(); // final IProject testProject = workspace.getRoot().getProject( // ObjectContributionClasses.PROJECT_NAME); // if (!testProject.exists()) { // testProject.create(null); // } // if (!testProject.isOpen()) { // testProject.open(null); // } // // assertPopupMenus( // "1", // new String[] { "IResource.1" }, // new StructuredSelection( // new Object[] { new ObjectContributionClasses.CResource() }), // IResource.class, true); // assertPopupMenus( // "2", // new String[] { "IProject.1" }, // new StructuredSelection( // new Object[] { new ObjectContributionClasses.CFile() }), // null, false); // assertPopupMenus( // "3", // new String[] { "IFile.1" }, // new StructuredSelection( // new Object[] { new ObjectContributionClasses.CFile() }), // IFile.class, true); // assertPopupMenus("4", new String[] { "IResource.1" }, // new StructuredSelection(new Object[] { // new ObjectContributionClasses.CFile(), // new ObjectContributionClasses.CResource() }), // IResource.class, true); // assertPopupMenus("5", new String[] { "IFile.1", "IProject.1" }, // new StructuredSelection(new Object[] { // new ObjectContributionClasses.CFile(), // new ObjectContributionClasses.CResource() }), // IResource.class, false); // assertPopupMenus("6", new String[] { "ResourceMapping.1" }, // new StructuredSelection(new Object[] { // new ObjectContributionClasses.CFile(), // new ObjectContributionClasses.CResource() }), // ResourceMapping.class, true); // assertPopupMenus( // "7", // new String[] { "ResourceMapping.1", "IResource.1" }, // new StructuredSelection( // new Object[] { new ObjectContributionClasses.ModelElement() }), // ResourceMapping.class, true); // // Ensure that the case where an object uses a contribution adapter that // // doesn't handle mappings // // will still show the menus for resource mappings // assertPopupMenus( // "8", // new String[] { "ResourceMapping.1", "IResource.1" }, // new StructuredSelection( // new Object[] { new ObjectContributionClasses.CResourceOnly() }), // ResourceMapping.class, true); // } // // /** // * This tests adaptable contributions that are not IResource. // * // * @since 3.1 // */ // public final void testAdaptables() { // assertPopupMenus("1", new String[] { "ICommon.1" }, // new StructuredSelection( // new Object[] { new ObjectContributionClasses.A() }), // ICommon.class, true); // assertPopupMenus("2", new String[] { "ICommon.1" }, // new StructuredSelection(new Object[] { // new ObjectContributionClasses.A(), // new ObjectContributionClasses.B() }), ICommon.class, // true); // assertPopupMenus("3", new String[] { "ICommon.1" }, // new StructuredSelection(new Object[] { // new ObjectContributionClasses.A(), // new ObjectContributionClasses.B(), // new ObjectContributionClasses.C(), // new ObjectContributionClasses.Common() }), // ICommon.class, true); // assertPopupMenus("4", new String[] { "ICommon.1" }, // new StructuredSelection(new Object[] { // new ObjectContributionClasses.Common(), // new ObjectContributionClasses.C(), // new ObjectContributionClasses.B(), // new ObjectContributionClasses.A() }), ICommon.class, // true); // assertPopupMenus("5", new String[] { "ICommon.1" }, // new StructuredSelection(new Object[] { // new ObjectContributionClasses.Common(), // new ObjectContributionClasses.C(), // new ObjectContributionClasses.B(), // new ObjectContributionClasses.C(), // new ObjectContributionClasses.A(), // new ObjectContributionClasses.Common() }), // ICommon.class, true); // assertPopupMenus("6", new String[] { "ICommon.1" }, // new StructuredSelection(new Object[] { // new ObjectContributionClasses.C(), // new ObjectContributionClasses.Common() }), // ICommon.class, true); // assertPopupMenus("7", new String[] { "ICommon.1" }, // new StructuredSelection(new Object[] { new Object() }), // ICommon.class, false); // assertPopupMenus("8", new String[] { "ICommon.1" }, // new StructuredSelection(new Object[] { // new ObjectContributionClasses.C(), new Object() }), // ICommon.class, false); // assertPopupMenus("9", new String[] { "ICommon.1" }, // new StructuredSelection(new Object[] { // new ObjectContributionClasses.C(), // new ObjectContributionClasses.A(), new Object() }), // ICommon.class, false); // } // // /** // * Ensure that there are no duplicate contributions. // * // * @since 3.1 // */ // public final void testDuplicateAdaptables() { // assertPopupMenus("1", new String[] { "ICommon.1" }, // new StructuredSelection( // new Object[] { new ObjectContributionClasses.D() }), // ICommon.class, true); // // repeat test on purpose to ensure no double call duplicates. // assertPopupMenus("1", new String[] { "ICommon.1" }, // new StructuredSelection( // new Object[] { new ObjectContributionClasses.D() }), // ICommon.class, true); // assertPopupMenus("2", new String[] { "ICommon.1" }, // new StructuredSelection(new Object[] { // new ObjectContributionClasses.D(), // new ObjectContributionClasses.A() }), ICommon.class, // true); // assertPopupMenus("3", new String[] { "ICommon.1" }, // new StructuredSelection(new Object[] { // new ObjectContributionClasses.A(), // new ObjectContributionClasses.D() }), ICommon.class, // true); // assertPopupMenus("4", new String[] { "ICommon.1" }, // new StructuredSelection(new Object[] { // new ObjectContributionClasses.Common(), // new ObjectContributionClasses.D() }), ICommon.class, // true); // assertPopupMenus("5", new String[] { "ICommon.1" }, // new StructuredSelection(new Object[] { // new ObjectContributionClasses.D(), // new ObjectContributionClasses.Common() }), // ICommon.class, true); // } // // /** // * Test non-adaptable contributions // * // * @since 3.1 // */ // public final void testNonAdaptableContributions() { // assertPopupMenus("1", new String[] { "ICommon.2" }, // new StructuredSelection(new Object[] { // new ObjectContributionClasses.A(), // new ObjectContributionClasses.B() }), ICommon.class, // false); // assertPopupMenus("2", new String[] { "ICommon.2" }, // new StructuredSelection(new Object[] { // new ObjectContributionClasses.D(), // new ObjectContributionClasses.C(), // new ObjectContributionClasses.Common() }), // ICommon.class, true); // assertPopupMenus("3", new String[] { "Common.2" }, // new StructuredSelection(new Object[] { // new ObjectContributionClasses.D(), // new ObjectContributionClasses.C(), // new ObjectContributionClasses.A() }), ICommon.class, // false); // assertPopupMenus("4", new String[] { "Common.2" }, // new StructuredSelection(new Object[] { // new ObjectContributionClasses.B(), // new ObjectContributionClasses.C(), // new ObjectContributionClasses.A() }), ICommon.class, // false); // } // // /** // * Helper class that will create a popup menu based on the given selection // * and then ensure that the provided commandIds are added to the menu. // * // * @param commandIds // * the command ids that should appear in the menu // * @param selection // * the selection on which to contribute object contributions // */ // public void assertPopupMenus(String name, String[] commandIds, // final ISelection selection, Class selectionType, boolean existance) { // ISelectionProvider selectionProvider = new ISelectionProvider() { // public void addSelectionChangedListener( // ISelectionChangedListener listener) { // } // // public ISelection getSelection() { // return selection; // } // // public void removeSelectionChangedListener( // ISelectionChangedListener listener) { // } // // public void setSelection(ISelection selection) { // } // }; // // // The popup extender needs a part to notify actions of the active part // final WorkbenchWindow window = (WorkbenchWindow) PlatformUI // .getWorkbench().getActiveWorkbenchWindow(); // final IWorkbenchPage page = window.getActivePage(); // IWorkbenchPart part = page.getActivePartReference().getPart(true); // // // Create a fake PopupMenuExtender so we can get some data back. // final MenuManager fakeMenuManager = new MenuManager(); // fakeMenuManager.add(new GroupMarker( // org.eclipse.ui.IWorkbenchActionConstants.MB_ADDITIONS)); // final PopupMenuExtender extender = new PopupMenuExtender(null, // fakeMenuManager, selectionProvider, part); // // /* // * Pretend to show the pop-up menu -- looking to motivate the extender // * to fill the menu based on the selection provider. // * // * TODO This causes a big delay (in the order of a minute or more) while // * trying to fill this menu. It seems to be loading a bunch of plug-ins, // * and doing class loading. // */ // extender.menuAboutToShow(fakeMenuManager); // // extender.dispose(); // // // Check to see if the appropriate object contributions are present. // final IContributionItem[] items = fakeMenuManager.getItems(); // Set seenCommands = new HashSet(Arrays.asList(commandIds)); // List commands = new ArrayList(Arrays.asList(commandIds)); // for (int i = 0; i < items.length; i++) { // IContributionItem contributionItem = items[i]; // // Step 1: test the selection // if (selectionType != null) { // IContributionItem item = contributionItem; // if (item instanceof SubContributionItem) { // item = ((SubContributionItem) contributionItem) // .getInnerItem(); // } // if (item instanceof PluginActionContributionItem) { // // Verify that the selection passed to the action has been // // converted // ISelection s = null; // if (s instanceof IStructuredSelection) { // for (Iterator it = ((IStructuredSelection) s) // .iterator(); it.hasNext();) { // Object element = it.next(); // assertTrue(name + " selection not converted", // selectionType.isInstance(element)); // } // } // } // } // // Step 2: remember that we saw this element // String id = contributionItem.getId(); // if (existance) { // boolean removed = commands.remove(id); // if (seenCommands.contains(id) && !removed) { // fail(name + " item duplicated in the context menu: " + id); // } // } else { // assertTrue(name + " item should not be in the context menu", // !commands.contains(id)); // } // } // // if (existance && !commands.isEmpty()) { // fail(name + " Missing " + commands.toString() // + " from context menu."); // } // } //}